import logging
from threading import Thread

import qpageview
from PyQt5.QtCore import Qt, QSize
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QGridLayout, QLabel, QWidget, QPushButton, QDialog, QComboBox, QVBoxLayout, QHBoxLayout

from config import config_file_path
from prepare_for_examen import IconLabel, right_icon, icon_size
from system import run_command


class PrintSettingsWidget(QDialog):
    def __init__(self, mainwindow=None):
        QDialog.__init__(self)
        self.mainwindow = mainwindow
        self.initUI()

    def print_test_page(self):
        self.save_button.setDisabled(True)
        self.next_action_label.show()
        self.next_action_label.setText('На принтер отправлена тестовая страница для проверки качества печати '
                                       'принтера.<br>Оцените качество печати в соответствии с инструкциями на '
                                       'напечатанной стороне. Тестовая страница напечатана корректно?')
        self.yes_button.show()
        self.no_button.show()
        run_command(f'lpr -P {self.printers_combobox.currentText().strip()} '
                    f'-o print-quality=5 resources/test_page.pdf')

    def save_printer_settings(self):
        run_command(f'py-ini-config set '
                    f'{config_file_path} PrinterSettings printer "{self.printers_combobox.currentText().strip()}"')
        try:
            self.mainwindow.prepare_for_examen_widget.printer_label.icon.setPixmap(
                QIcon.fromTheme(right_icon).pixmap(icon_size))
            self.mainwindow.prepare_for_examen_widget.chosen_printer_label.setText(
                f'Выбранный для печати ЭМ принтер: {self.printers_combobox.currentText().strip()}')
        except Exception as e:
            logging.info(f'Не удалось обновить информацию о принтере в виджете настройки экзамена. Исключение: {e}')
        self.accept()

    def refresh_printers_list(self):
        printers_list = run_command("lpstat -p | awk '{print $2}'").strip().split('\n')
        self.printers_combobox.addItems(printers_list)
        self.status_bar_label.setText('Список устройств обновлён.')
        saved_printer = run_command(f'py-ini-config get {config_file_path} PrinterSettings printer').strip()
        try:
            self.printers_combobox.setCurrentText(saved_printer)
        except Exception as e:
            logging.info(f'Был сохранён принтер {saved_printer}, но не удалось установить его по умолчанию. '
                         f'Исключение: {e}')

    def thread_for_refresh_printers_list(self):
        thread = Thread(target=self.refresh_printers_list)
        self.status_bar_label.setText('Обновляется список устройств...')
        thread.start()

    def hide_quality_widgets(self):
        self.next_action_label.show()
        self.next_action_label.setText('Необходимо выполнить печать тестовой страницы')
        self.yes_button.hide()
        self.no_button.hide()

    def enable_saving(self):
        self.save_button.setEnabled(True)
        self.hide_quality_widgets()
        self.next_action_label.hide()

    def initUI(self):
        layout = QGridLayout()
        self.setLayout(layout)

        layout.addWidget(QLabel('Принтер'), 0, 0)

        self.status_bar_label = QLabel('Обновляется список устройств...')
        self.printers_combobox = QComboBox()
        self.thread_for_refresh_printers_list()

        layout.addWidget(self.printers_combobox, 1, 0)
        find_printer_button = QPushButton('Найти принтер')
        layout.addWidget(find_printer_button, 1, 1)
        attention_label = QLabel('<b>ⓘ Внимание!</b> '
                                 'При смене выбранного принтера необходимо выполнить тестовую печать повторно.')
        attention_label.setStyleSheet('QLabel {background-color: #d0d0ff; margin: 5px; color: black;}')
        layout.addWidget(attention_label, 2, 0, 1, 2)

        self.preview_page_view = qpageview.View()
        self.preview_page_view.loadPdf('./resources/test_page.pdf')
        self.preview_page_view.setViewMode(qpageview.FixedScale)
        layout.addWidget(self.preview_page_view, 3, 0)
        right_widget = QWidget()
        right_widget_layout = QVBoxLayout()
        right_widget.setLayout(right_widget_layout)
        right_widget_layout.addWidget(QLabel('<h3>Тестовая страница</h3>'))
        print_test_page_button = QPushButton('Печать тестовой страницы')
        print_test_page_button.clicked.connect(self.print_test_page)
        right_widget_layout.addWidget(print_test_page_button)
        self.next_action_label = QLabel('Необходимо выполнить печать тестовой страницы')
        self.next_action_label.setWordWrap(True)
        right_widget_layout.addWidget(self.next_action_label)

        yesnowidget = QWidget()
        yesnowidget_layout = QHBoxLayout()
        yesnowidget_layout.setAlignment(Qt.AlignLeft)
        yesnowidget.setLayout(yesnowidget_layout)
        self.yes_button = QPushButton('Да')
        self.yes_button.clicked.connect(self.enable_saving)
        self.yes_button.setFixedWidth(100)
        self.yes_button.hide()
        self.no_button = QPushButton('Нет')
        self.no_button.clicked.connect(self.hide_quality_widgets)
        self.no_button.setFixedWidth(100)
        self.no_button.hide()
        yesnowidget_layout.addWidget(self.no_button)
        yesnowidget_layout.addWidget(self.yes_button)
        yesnowidget_layout.addStretch()
        right_widget_layout.addWidget(yesnowidget)

        right_widget_layout.addStretch()
        layout.addWidget(right_widget, 3, 1)

        cancel_button = QPushButton('Отменить')
        cancel_button.clicked.connect(lambda: self.reject())
        layout.addWidget(cancel_button, 4, 0)
        self.save_button = QPushButton('Сохранить')
        self.save_button.setDisabled(True)
        self.save_button.clicked.connect(self.save_printer_settings)
        layout.addWidget(self.save_button, 4, 1)
        layout.addWidget(self.status_bar_label, 5, 0, 1, 2)
        self.setMinimumHeight(600)
        self.setWindowTitle('Настройка печати')
